/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
//PRUEBA EN INGENIERIA DE SOFTWARE DE SUBVERSION

package seriedetaylor;

import java.util.Scanner;

public class SerieDeTaylor {

private int interacciones;
private double vector[];
private double vectorAcum[];
private double vectorError[];
private double x;

//inicialiizamos valores en el constructor de la clase
public SerieDeTaylor(){
    interacciones=0;
}

public int getInteracciones() {
 return interacciones;
}

public void setInteracciones(int inte) {
 interacciones = inte;
 //asignamos tamaño al vector
 vector=new double[interacciones];
 vectorAcum=new double[interacciones];
 vectorError=new double[interacciones];

}

public double getVector(int p) {
 return vector[p];
 }

public void setVector(int p,double valor) {
 vector[p] = valor;
} 

public double getVectorAcum(int p) {
 return vectorAcum[p];
 }

public void setVectorAcum(int p,double valor) {
 vectorAcum[p] = valor;
} 

public double getVectorError(int p) {
 return vectorError[p];
 }

public void setVectorError(int p,double valor) {
 vectorError[p] = valor;
} 

public double getX() {
 return x;
}

public void setX(double x) {
 this.x = x;
}

//definimos funciones a las que se la aplicara metodo de taylor
    
 public double coseno(){
    double s = 0;
    int signo = 1;

    for(int i=0; i<interacciones; i++){
        //System.out.println("Factorialen pos : "+i+"  es:"+factorial(2*i+1));
      vector[i]= signo*Math.pow(x, 2*i) / factorial(2*i);      
      s+=vector[i];
      vectorAcum[i]=s;
      vectorError[i]=Math.abs(vectorAcum[i]-Math.cos(getX()));
      
      signo *= -1;      
    }
    return s;
  }

  public double seno(){    
    double s = 0;
    int signo = 1;

    for(int i=0; i<interacciones; i++){
        
      vector[i]=signo*Math.pow(x, 2*i+1) / factorial(2*i+1);
      s+=vector[i];
      vectorAcum[i]=s;
      vectorError[i]=Math.abs(vectorAcum[i]-Math.sin(getX()));
      
      signo *= -1;
    }    
    return s;
   
  }
  
  public double  euler(){
    double s = 0;    
    for(int i=0; i<interacciones; i++){
      vector[i]= (Math.pow(x, i)) / factorial(i);
      s+=vector[i];     
      vectorAcum[i]=s;
      vectorError[i]=Math.abs(vectorAcum[i]-Math.exp(getX()));
      
    }  
    return s;
  }
          
  //hallamos le factorial  de un numero
  public double factorial(int x){
    int i;
    double fact = 1;

    for(i=1; i<=x; i++)
      fact *= i;
    return fact;

  }
  
  
    public static void main(String[] args) {
       Scanner in =new Scanner(System.in);
       SerieDeTaylor t=new SerieDeTaylor();
       System.out.print("digita tamaño numero de interacciones: ");
       t.setInteracciones(in.nextInt());
       //System.out.print("digita valor de x: ");
       //double x=in.nextDouble();
       /*double total=t.euler(x);
        for (int i = 0;i<t.getInteracciones(); i++){
             System.out.println("valor de x en pos "+i+" es: "+t.getVector(i));           
        }
        System.out.println("El acumulado de euler fue: "+total);
         */
        System.out.print("digita valor de x: ");
       t.setX(in.nextDouble());
        double total1=t.coseno();
        for (int i = 0;i<t.getInteracciones(); i++){
             System.out.println("valor de x en pos "+i+" es: "+t.getVector(i));           
        }
        System.out.println("El acumulado de euler fue: "+total1);
        
        /*
        double total=t.seno(x);
        for (int i = 0;i<t.getInteracciones(); i++){
             System.out.println("valor de x en pos "+i+" es: "+t.getVector(i));           
        }
        System.out.println("El acumulado de euler fue: "+total);
       */
    }

    


}
